from django.http import JsonResponse
from django.shortcuts import redirect
from django.conf import settings

import logging
from Tools.logtools.logtools import logfile_hander, console_handler
logger = logging.getLogger(__name__)
logger.setLevel(level=logging.INFO)
logger.addHandler(logfile_hander())
logger.addHandler(console_handler())

class APIPermissionMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # 排除路径配置
        EXEMPT_PATHS = [
            '/',
            '/mgr/api/login',
            '/mgr/api/signin',
            '/mgr/view/signin',
            '/mgr/view/signup',
            '/mgr/api/signup',
            '/favicon.ico',
            '/rmb/api/getmerchantinfo'
        ]

        # 静态文件放行
        if request.path.startswith('/static/'):
            return self.get_response(request)

        # 检查是否在豁免列表
        if request.path in EXEMPT_PATHS:
            # 根路径直接重定向
            if request.path == '/' and not request.user.is_authenticated:
                return redirect(settings.LOGIN_URL)
            return self.get_response(request)

        # 登录状态检查
        if not request.user.is_authenticated:
            # API 请求返回 JSON
            if request.path.startswith('/api/'):
                logger.warning(f"用户: {request.user.username} 试图访问:{request.path}")
                return JsonResponse({"code": 403, "msg": "未登录"}, status=403)
            # 页面请求重定向
            return redirect(settings.LOGIN_URL)

        # 超级管理员权限检查
        if request.path.startswith('/mgr/view/users'):
            if not request.user.is_superuser:
                # API 返回 JSON
                if request.path.startswith('/api/'):
                    logger.warning(f"用户: {request.user.username} 试图访问:{request.path}")
                    return JsonResponse(
                        {"code": 403, "msg": "需要超级管理员权限"},
                        status=403
                    )
                # 页面请求返回错误页
                return redirect('/error/403/')  # 需要配置错误页面路由

        return self.get_response(request)